﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//5.如果变量是内部链接的话，那么此变量只能在当前文件内访问；
//6.如果变量是外部链接的话，那么此变量可以被其他文件使用；

//11.头文件.h，不要写定义，只写声明；

int aG = 10;//全局区  3.等同于 extern int a = 10;   默认为外部链接；

//1.全局静态变量和局部静态变量，都存储在静态区，在程序运行期间都是合法有效；
//2.局部静态变量符号c的可见范围，仅限于当前函数testGlobalStatic()内部，全局静态变量b的可见范围，从定义到文件结尾；
static int b = 20;//静态区		4.静态全局变量是内部链接；
void testGlobalStatic()
{
	static int c = 30;

	//8.头文件.h，是不会编译的，只编译.c文件；每一个.c文件，称为一个编译单元；
		//编译器独立编译每一个.c文件；
	//9.声明变量g_a，表示告诉编译器这个符号是存在的，让程序先编译通过，链接器会主动去找这个变量名g_a的位置；
	extern int g_a;
	printf("7.外部链接文件GlobalStaticAreaTest.c中的变量g_a的值为：%d\n", g_a);//100
}
//---------------------------------------------------------------------------------------------------------------
//12.常量区，字符串常量，全局const变量；
	//const全局变量在常量区，直接或间接，都不能修改其值；
const int g_b = 100;
void testConst()
{
	//15.全局const变量g_b在常量区，一旦初始化，不能被修改；

	//13.不能直接修改；
	//g_b = 200;
	//14.也不能间接修改，程序直接报错；
	int* pGlobal = (int*)&g_b;
	//*pGlobal = 200;

	//16.const局部变量g_c，栈区；
	const int g_c = 300;

	//17.不能直接修改g_c；
	//g_c = 400;
	//18.可以间接修改g_c;
	int* pLocal = (int*)&g_c;
	*pLocal = 400;
	printf("19.间接修改const局部变量g_c后，g_c为：%d\n", g_c);//400

	//20.字符串常量"hello world!"就是这块内存的名字，可以直接取它的地址；"hello world!"是char*类型变量；
	char* pConst = "hello world!";
	printf("21.获取字符串常量hello world!的地址：%d\n", &"hello world!");//16397112
	printf("22.char*类型指针变量pConst的地址为：%d\n", pConst);//16397112

	printf("23.指针变量pConst地址指向的字符串为：%s\n", pConst);//hello world!
	//25.程序直接报错，并不能修改字符串常量的内容，只能读；然而，在bcc里面是可以修改的，在gcc里面并不可以；
	//pConst[0] = 'A';
	//printf("24.修改了pConst指向的字符串的首字母后，则字符串为：%s\n", pConst);

	//27.字符串常量区的内容不可修改，地址也不变；无论定义多少个变量，其地址都一样；然而，在bcc里面，地址不同！
	char* p1 = "helloworld";
	char* p2 = "helloworld";
	printf("25.输出p1的地址：%d\n", p1);//3503992
	printf("26.输出p2的地址：%d\n", p2);//3503992
}

//main183：全局静态区内存管理
int main183()
{
	testGlobalStatic();
	testConst();

	system("pause");
	return EXIT_SUCCESS;
}